import { Http } from './http'; //引入 http 请求封装
import { LocalStorage } from '@/utils/utils';
import { isTokenExpired } from '@/utils/token';
import { BusinessError } from '@/utils/error'; //引入自定义异常处理部分

export type BizContent = Record<string, any>;
/**
 * 业务请求参数与服务端对应
 */
interface bizParams {
  app_id: string;
  sign: string;
  method: string;
  timestamp: number;
  biz_content: BizContent;
}
// 2. 封装公共逻辑：Token 校验 + 请求头设置（复用 save 和 post 方法的重复代码）
const validateTokenAndSetHeader = () => {
  const token = LocalStorage.get('token');
  //console.log("token:", token);

  // Token 不存在：抛出未登录错误
  if (!token) {
    throw new BusinessError('[未登录]系统检测到没有登录信息。', 503);
  }

  // Token 过期：抛出登录过期错误
  if (isTokenExpired(token)) {
    throw new BusinessError('[登录过期]系统检测到登录信息已过期，请重新登录。', 503);
  }

  // Token 有效：设置到请求头
  Http.setToken(token);
};
const buildPostParams = (actionName: string, params: BizContent): bizParams => {
  return {
    app_id: 'app_id',
    sign: 'sign',
    method: actionName,
    timestamp: Date.now(),
    biz_content: params,
  };
};
/**
 * 业务请求（添加，修改）
 * @param params 业务请求参数
 * @returns 业务请求响应数据
 */
async function httpSave(actionName: string, params: BizContent) {
  validateTokenAndSetHeader(); // 检查并设置 token
  const postParams = buildPostParams(actionName, params);
  const res = await Http.post('/gateway', postParams);
  return res;
}
/**
 * 业务请求（分页）
 * @param params 业务请求参数
 * @returns 业务请求响应数据 (分页)
 */
async function httpPage(actionName: string, params: BizContent) {
  validateTokenAndSetHeader(); // 检查并设置 token
  const postParams = buildPostParams(actionName, params);
  const res = await Http.post('/gateway', postParams);
  //const hasPagination = 'current_page' in res && 'page_size' in res && 'total_records' in res;
  return res;
}
/**
 * 业务请求（列表、详情）
 * @param params 业务请求参数
 * @returns 业务请求响应数据 (列表、详情)
 */
async function httpList(actionName: string, params: BizContent) {
  validateTokenAndSetHeader(); // 检查并设置 token
  const postParams = buildPostParams(actionName, params);

  const res = await Http.post('/gateway', postParams);
  return res.records;
}

export const bizApi = {
  httpList,
  httpPage,
  httpSave,
};
